#include "blockqueue.hpp"
#include "task.hpp"
#include<time.h>

using namespace std;

void *Producter(void *p_args)
{
    int len=opers.size();
    BlockQueue<Task>* bq=static_cast<BlockQueue<Task>*>(p_args);
    while (1)
    {
        // 模拟生产者获取数据的过程
        int data1=rand()%10+1;//[1,10]
        usleep(100);
        int data2=rand()%10;
        char op=opers[rand()%len];
        Task t(data1,data2,op);
        bq->push(t);//生产任务
        // cout << "生产了一个任务:" << t.GetTask() <<endl;
        printf("生产了一个任务：%s,thread id: %x\n",t.GetTask().c_str(),pthread_self());
        sleep(1);
    }
    return nullptr;
}

void *Consumer(void *c_args)
{
    BlockQueue<Task>* bq=static_cast<BlockQueue<Task>*>(c_args);
    while (1)
    {
        //消费任务
        Task t= bq->pop();
        //计算
        t.run();//模拟消费者消费消费数据的过程
        // cout << "处理任务: " <<t.GetTask()<<" 运算结果："<<t.GetResult()<<endl;
        printf("处理任务：%s,运算结果：%s,thread id: %x\n",t.GetTask().c_str(),t.GetResult().c_str(),pthread_self());
    }
    return nullptr;
}

int main()
{
    srand(time(nullptr));
    pthread_t p[5], c[3];
    BlockQueue<Task>* bq=new BlockQueue<Task>;
    for(int i=0;i<5;i++)
    pthread_create(p+i, nullptr, Producter, (void *)bq);
    for(int i=0;i<3;i++)
    pthread_create(c+i, nullptr, Consumer, (void *)bq);

    for(int i=0;i<5;i++)
    pthread_join(p[i], nullptr);
    for(int i=0;i<3;i++)
    pthread_join(c[i], nullptr);

    delete bq;

    return 0;
}